home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / fp / fp-upn.sty < prev    next >
Text File  |  1995-03-09  |  5KB  |  173 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-upn}[1995/02/18]
  3.  
  4. %version information
  5. \def\FP@upnversion{2.0}
  6. \message{%
  7.   `UPN Fixed Point Calculator',%
  8.   \space\space\space%
  9.   Version \FP@upnversion%
  10.   \space(C) Michael Mehlich%
  11. }
  12.  
  13. %resolve dependencies
  14. \RequirePackage{defpattern}
  15.  
  16. %%%public area (macros which may be used)%%%
  17. \def\FPupn#1#2{\FP@@upn#1{#2}} % #1 := eval(#2)
  18.  
  19. %%%private fp-area (don't use these macros)%%%
  20.  
  21. %routines for stack manipulation
  22.  
  23. \edef\FP@stack{()}
  24.  
  25. \defpattern\FP@@@putstack[(#2)#3]{\edef\FP@stack{(#3,#2)}}
  26. \defpattern\FP@@@putstack[()#2]{\edef\FP@stack{(#2)}}
  27. \def\FP@@putstack(#1)#2{\FP@@@putstack[(#1)#2]}
  28. \def\FP@putstack#1{\expandafter\FP@@putstack\FP@stack{#1}}
  29.  
  30. \defpattern\FP@@@getstack[(#2)#3]{\edef\FP@stack{()}\edef#2{#3}}
  31. \defpattern\FP@@@getstack[(#2)#3,#4]{\edef\FP@stack{(#4)}\edef#2{#3}}
  32. \defpattern\FP@@@getstack[(#2)]{\FP@errmessage{UPN stack is empty}}
  33. \def\FP@@getstack(#1)#2{\FP@@@getstack[(#2)#1]}
  34. \def\FP@getstack#1{\expandafter\FP@@getstack\FP@stack{#1}}
  35.  
  36. %local debug macro
  37. \def\FP@upn@debug#1{\FP@debug{upn: #1}}
  38. \def\FP@upnc@debug#1{\FP@upn@debug{calculating \string"#1\string"}}
  39.  
  40. %call fp-functions with parameters from stack
  41. \def\FP@const#1{%
  42.   \FP@upnc@debug{constant #1}
  43.   \expandafter\FP@putstack\csname FP#1\endcsname%
  44. }
  45. \def\FP@nullop#1{%
  46.   \FP@upnc@debug{#1()}%
  47.   \csname FP#1\endcsname\FP@valc%
  48.   \FP@putstack\FP@valc%
  49. }
  50. \def\FP@monop#1{%
  51.   \FP@getstack\FP@vala%
  52.   \FP@upnc@debug{#1(\FP@vala)}%
  53.   \csname FP#1\endcsname\FP@valc\FP@vala%
  54.   \FP@putstack\FP@valc%
  55. }
  56. \def\FP@monopb#1{%
  57.   \FP@getstack\FP@vala%
  58.   \FP@upnc@debug{#1(\FP@vala)}%
  59.   \csname FP#1\endcsname\FP@valc\FP@vald\FP@vala%
  60.   \FP@putstack\FP@vald\FP@putstack\FP@valc%
  61. }
  62. \def\FP@binop#1{%
  63.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  64.   \FP@upnc@debug{\FP@vala\space #1 \FP@valb}%
  65.   \csname FP#1\endcsname\FP@valc\FP@vala\FP@valb%
  66.   \FP@putstack\FP@valc%
  67. }
  68. \def\FP@binopb#1{%
  69.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  70.   \FP@upnc@debug{#1(\FP@valb:\FP@vala)}%
  71.   \csname FP#1\endcsname\FP@valc\FP@valb\FP@vala%
  72.   \FP@putstack\FP@valc%
  73. }
  74. \def\FP@binopc#1{%
  75.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  76.   \FP@upnc@debug{\FP@valb-th #1 of \FP@vala}%
  77.   \csname FP#1\endcsname\FP@valc\FP@vala\FP@valb%
  78.   \FP@putstack\FP@valc%
  79. }
  80.  
  81. %the calculation loop
  82.  
  83. %put value to stack
  84. \def\FP@put#1\@upnend{%
  85.   \FP@upnc@debug{constant #1}%
  86.   \FP@putstack{#1}%
  87. }
  88. \defpattern\FP@upn[#2]{\expandafter\FP@put#2\@upnend}
  89.  
  90. %binary functions from fp-basic
  91. \defpattern\FP@upn[+]{\FP@binop{add}}
  92. \defpattern\FP@upn[-]{\FP@binop{sub}}
  93. \defpattern\FP@upn[*]{\FP@binop{mul}}
  94. \defpattern\FP@upn[/]{\FP@binop{div}}
  95.  
  96. %unary functions from fp-basic
  97. \defpattern\FP@upn[abs]{\FP@monop{abs}}
  98. \defpattern\FP@upn[neg]{\FP@monop{neg}}
  99.  
  100. %functions from fp-snap
  101. \defpattern\FP@upn[round]{\FP@binopb{round}}
  102. \defpattern\FP@upn[trunc]{\FP@binopb{trunc}}
  103. \defpattern\FP@upn[clip]{\FP@monop{clip}}
  104.  
  105. %functions from fp-exp
  106. \defpattern\FP@upn[e]{\FP@const{e}}
  107. \defpattern\FP@upn[exp]{\FP@monop{exp}}
  108. \defpattern\FP@upn[ln]{\FP@monop{ln}}
  109. \defpattern\FP@upn[pow]{\FP@binopc{pow}}
  110. \defpattern\FP@upn[root]{\FP@binopc{root}}
  111.  
  112. %functions from fp-random
  113. \defpattern\FP@upn[seed]{%
  114.   \FP@getstack\FP@vala\FPseed=\FP@vala%
  115. }
  116. \defpattern\FP@upn[random]{\FP@nullop{random}}
  117.  
  118. %functions from fp-trigo
  119. \defpattern\FP@upn[pi]{\FP@const{pi}}
  120. \defpattern\FP@upn[sin]{\FP@monop{sin}}
  121. \defpattern\FP@upn[cos]{\FP@monop{cos}}
  122. \defpattern\FP@upn[sincos]{\FP@monopb{sincos}}
  123. \defpattern\FP@upn[tan]{\FP@monop{tan}}
  124. \defpattern\FP@upn[cot]{\FP@monop{cot}}
  125. \defpattern\FP@upn[tancot]{\FP@monopb{tancot}}
  126. \defpattern\FP@upn[arcsin]{\FP@monop{arcsin}}
  127. \defpattern\FP@upn[arccos]{\FP@monop{arccos}}
  128. \defpattern\FP@upn[arcsincos]{\FP@monopb{arcsincos}}
  129. \defpattern\FP@upn[arctan]{\FP@monop{arctan}}
  130. \defpattern\FP@upn[arccot]{\FP@monop{arccot}}
  131. \defpattern\FP@upn[arctancot]{\FP@monopb{arctancot}}
  132.  
  133. %stack manipulators
  134. \defpattern\FP@upn[pop]{%
  135.   \FP@getstack\FP@vala%
  136.   \FP@upn@debug{removing top number \string"\FP@vala\string"}%
  137. }
  138. \defpattern\FP@upn[swap]{%
  139.   \FP@getstack\FP@vala\FP@getstack\FP@valb%
  140.   \FP@upn@debug{exchanging top numbers \string"\FP@vala\string" and \string"\FP@valb\string"}%
  141.   \FP@putstack\FP@vala\FP@putstack\FP@valb%
  142. \defpattern\FP@upn[copy]{%
  143.   \FP@getstack\FP@vala%
  144.   \FP@upn@debug{duplicating top number \string"\FP@vala\string"}%
  145.   \FP@putstack\FP@vala\FP@putstack\FP@vala%
  146. }
  147.  
  148. %left-to-right loop 
  149. \defpattern\FP@upn[#2 ]{\FP@upn[#2]}
  150. \defpattern\FP@upn[ #2]{\FP@upn[#2]}
  151. \defpattern\FP@upn[#2 #3]{\FP@upn[#2]\FP@upn[#3]}
  152.  
  153. %get result from stacks with one value only
  154. \defpattern\FP@@upn@result[(#2)#3]{\edef#2{#3}}
  155. \defpattern\FP@@upn@result[(#2)]{\FP@errmessage{UPN stack is empty}\edef#2{0}}
  156. \defpattern\FP@@upn@result[(#2)#3,#4]{\FP@errmessage{Evaluation results in multiple values}\edef#2{#3}}
  157. \def\FP@upn@result(#1)#2{\FP@@upn@result[(#2)#1]}
  158.  
  159. %the main routine
  160. \def\FP@@upn#1#2{%
  161.   \bgroup%
  162.     \FP@beginmessage{UPN}%
  163.     \FP@upn@debug{+++ computing upn-expression \string"#2\string"}%
  164.     \FP@upn[#2]%
  165.     \FP@upn@debug{+++ result of upn-expression is \string"\FP@stack\string"}%
  166.     \expandafter\FP@upn@result\FP@stack\FP@tmp%
  167.     \FP@endmessage{}%
  168.     \global\let\FP@tmp\FP@tmp%
  169.   \egroup%
  170.   \let#1\FP@tmp%
  171. }
  172.